package com.tanhua.server.service;

import com.tanhua.commons.templates.HuanXinTemplate;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mongo.RecommendUser;
import com.tanhua.domain.mongo.UserLike;
import com.tanhua.domain.vo.VisitorsVo;
import com.tanhua.dubbo.api.FriendApi;
import com.tanhua.dubbo.api.RecommendUserApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.api.UserLikeApi;
import com.tanhua.server.interceptor.UserHolder;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class TanHuaService {

    // 注入推荐用户的API
    @Reference
    private RecommendUserApi recommendUserApi;

    // 注入用户详细信息的API
    @Reference
    private UserInfoApi userInfoApi;

    // 注入用户喜欢的API
    @Reference
    private UserLikeApi userLikeApi;

    // 注入好友的Api
    @Reference
    private FriendApi friendApi;

    // 注入环信
    @Autowired
    private HuanXinTemplate huanXinTemplate;


    /**
     * 探花-左滑右滑
     * 随机展示10个用户
     *
     * @return
     */
    public ResponseEntity<Object> tanHuaFindByRecommendUser() {
        // 1.获取当前登陆用户
        Long userId = UserHolder.getUserId();

        // 2.根据当前登陆用户，调用Api接口查询推荐用户
        List<RecommendUser> recommendUserList = recommendUserApi.findRecommendUser(userId);

        // 创建随机的用户对象
        Random random = new Random();


        // 创建voList
        List<VisitorsVo> voList = new ArrayList<>();

        // 3.随机取出10条推荐用户
        if (recommendUserList == null) {
            return ResponseEntity.ok(voList);
        }

        // 判断推荐用户数是否大于10
        if (recommendUserList.size() >= 10) {

            // 创建HashSet集合为了不重复
            Set<RecommendUser> recommendUsersSet = new HashSet<>();

            while (true) {

                // 根据集合的大小取出推荐用户的数量
                int size = recommendUserList.size();

                // 随机取出推荐用户集合的索引
                int i = random.nextInt(size);

                // 根据索引找出RecommendUser对象
                RecommendUser recommendUser = recommendUserList.get(i);

                // 加入到set集合
                recommendUsersSet.add(recommendUser);

                // 达到10个用户 退出循环
                if (recommendUsersSet.size() == 10) {

                    break;
                }
            }

            // 遍历循环10推荐用户
            for (RecommendUser recommendUser : recommendUsersSet) {
                // 根据推荐用户的Id去查询用户的详细信息
                UserInfo userInfo = userInfoApi.findById(recommendUser.getRecommendUserId());
                // 创建vo
                VisitorsVo vo = new VisitorsVo();

                // 判断用户详细信息是否为空
                if (userInfo != null) {
                    // 封装
                    BeanUtils.copyProperties(userInfo, vo);

                    // 判断用户信息信息的标签不等于空
                    if (userInfo.getTags() != null) {
                        // 设置用户标签，多个用逗号分隔
                        vo.setTags(userInfo.getTags().split(","));
                    }
                }
                // 添加到集合中
                voList.add(vo);

            }
        } else {
            // 遍历循环10推荐用户
            for (RecommendUser recommendUser : recommendUserList) {
                // 根据推荐用户的Id去查询用户的详细信息
                UserInfo userInfo = userInfoApi.findById(recommendUser.getRecommendUserId());
                // 创建vo
                VisitorsVo vo = new VisitorsVo();

                // 判断用户详细信息是否为空
                if (userInfo != null) {
                    // 封装
                    BeanUtils.copyProperties(userInfo, vo);

                    // 判断用户信息信息的标签不等于空
                    if (userInfo.getTags() != null) {
                        // 设置用户标签，多个用逗号分隔
                        vo.setTags(userInfo.getTags().split(","));
                    }
                }
                // 添加到集合中
                voList.add(vo);

            }
        }

        return ResponseEntity.ok(voList);
    }


    /**
     * 探花-不喜欢
     *
     * @param recommendUserId 推荐用户Id
     * @return
     */
    public ResponseEntity<Object> tanHuaUnLove(Long recommendUserId) {
        // 1.获取当前用户Id
        Long userId = UserHolder.getUserId();
        // 2.根据当前用户Id删除推荐用户
        recommendUserApi.deleteRecommendUserId(userId, recommendUserId);
        // 4.返回给前端
        return ResponseEntity.ok(null);
    }

    /**
     * 探花-右滑喜欢
     * 右滑进入我的喜欢或互相喜欢
     *
     * @param recommendUserId 推荐用户Id
     * @return
     */
    public ResponseEntity<Object> tanHuaLove(Long recommendUserId) {
        // 1.获取当前用户Id
        Long userId = UserHolder.getUserId();

        // 2.查询我的粉丝
        UserLike userLikes = userLikeApi.queryUserFanList(userId, recommendUserId);

        // 是我的粉丝添加到互相喜欢
        if (userLikes != null) {
            // 3.1 删除粉丝中的喜欢数据
            userLikeApi.delete(userId, recommendUserId);
            // 2.记录双向的好友关系
            friendApi.save(userId, recommendUserId);
            // 3.注册好友关系到环信 （喜欢的用户、登陆的用户要先在环信注册）
            huanXinTemplate.contactUsers(userId, recommendUserId);
        }else {
            // 不是我的粉丝就添加到喜欢
            userLikeApi.saveFans(userId, recommendUserId);
        }

        // 4.删除用户的推荐好友
        recommendUserApi.deleteRecommendUserId(userId, recommendUserId);
        return ResponseEntity.ok(null);

    }

}
